//package cn.usian.jyzx.product.controller;
//
//import io.swagger.v3.oas.annotations.tags.Tag;
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.UUID;
//import java.util.concurrent.TimeUnit;
//
///**
// * @TODO:
// * @Author:baimu
// * @Date:2024 06 12 17 44
// **/
//
//@RestController
//@RequestMapping("/api/product")
//@Tag(name = "商品相关接口")
//@Slf4j
//public class ProductSkuController {
//
//    @Autowired
//    RedisTemplate redisTemplate;
//
//    /**
//     *
//     *
//     * 脚本：Javascript Java脚本  浏览器
//     *       sql 脚本             数据库
//     *       脚本语言不能独立运行， 必须依赖一定的环境（宿主）
//     *
//     *  分布式锁：
//     *   mysql：          磁盘
//     *       悲观锁   for update
//     *       乐观锁   version（版本号）+1
//     *   ZK：
//     *     文件系统和监控系统  磁盘
//     *
//     *   redis
//     *      redis 原生命令 本身自带
//     *      内存
//     *      setnx命令：set if not exists 这个key 不存在的时候才设置成功， 成功1，失败0
//     *      setnx name
//     */
//
//    /**
//     * 防止发生死锁：      本人不释放锁，别人也抢不到
//     * 代码异常： finally 能主动释放锁
//     * 服务器异常： 到了过期时间能主动释放          过期时间的问题？太长太短
//     * 本进程只能释放自己加的锁:
//     *     判断：  原子性  lua脚本（不会写）
//     *
//     *  Redisson   redis官方推行 分布式锁框架
//     *
//     *
//     */
//    public void save(){
//        redisTemplate.opsForValue().set("name","zhangsan");
//
//        //随机性， 唯一性
//       String uuId =  UUID.randomUUID().toString();
//
//        //setnx命令：set if not exists
//        Boolean aBoolean = redisTemplate
//                .opsForValue()
//                .setIfAbsent("name", uuId,
//                        100L, TimeUnit.SECONDS);
//        redisTemplate.expire("name",2,TimeUnit.HOURS);
//        log.info("aBoolean:{}",aBoolean);
//        try {
//            //获得锁，肯定不会发生并发（只有1吧锁--》即代表1个进程能执行）
//            if(aBoolean){
//                //抢票
//                //update 余票
//            }
//        }catch (Exception e){
//
//        } finally {
//            //释放锁
//            String nameValue = (String)redisTemplate.opsForValue().get("name");
//            if(nameValue.equals(uuId)){
//                redisTemplate.delete("name");
//            }
//
//            SimpleDateFormat simpleDateFormat =
//                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            String format = simpleDateFormat.format(new Date());
//
//
//        }
//
//
//
//
//
//
//
//        //执行完业务--》释放锁--->为了解决死锁【本人不释放锁，别人也抢不到】
//        //设置key的过期时间
//
//        //返回1，说明该进程获得锁，将 key 的值设为 value
//        //返回0，说明其他进程已经获得了锁，进程不能进入临界区
//
//
//
//    }
//
//
//
//    @Autowired
//    RedissonClient redissonClient;
//
//
//    /**
//     * key过期时间的问题？太长太短：
//     * key：name   默认过期30S   30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
//     * 守护进程（看门狗） dog watch：定时任务：每隔10S，如果发现业务还没有执行完，延长过期时间
//     *
//     *
//     * lua:原子性
//     * threadId：线程ID 1 1
//     *            2 2
//     */
//    public void save2()  {
//        //获取锁
//        RLock lock = redissonClient.getLock("name");
//
//        try{
//
//            //时间范围内加锁
//            boolean b = lock.tryLock(100, TimeUnit.SECONDS);
//            //true: 抢锁成功
//
//            if(b){
//                //业务
//
//            }
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        } finally {
//            //释放锁
//            lock.unlock();
//        }
//
//
//
//
//    }
//
//
//
//
//
//
//
//
//
//}
//}
